#Boa:Dialog:Devolucion

import wx
import wx.grid
import consultasBD
import utiles
from decimal import Decimal
import sincronizar_tabla

ROJO = (255, 145, 145, 255)
VERDE = (145, 255, 145, 255)
AZUL = (145, 145, 255, 255)
BLANCO = (255, 255, 255, 255)
AMARILLO = (254, 248, 191, 255)
GRIS = ( 220, 220, 220, 255)
NEGRO = ( 0, 0, 0, 255)
VERDENEGRO = ( 47, 79, 79, 255)

def create(parent):
    return Devolucion(parent)

[wxID_DEVOLUCION, wxID_DEVOLUCIONBUTTON3, wxID_DEVOLUCIONBUTTON4, 
 wxID_DEVOLUCIONBUTTON5, wxID_DEVOLUCIONCHECKBOX1, wxID_DEVOLUCIONCOMBOBOX1, 
 wxID_DEVOLUCIONGRID1, wxID_DEVOLUCIONSTATICTEXT1, wxID_DEVOLUCIONSTATICTEXT2, 
 wxID_DEVOLUCIONSTATICTEXT3, wxID_DEVOLUCIONSTATICTEXT4, 
 wxID_DEVOLUCIONTEXTCTRL1, 
] = [wx.NewId() for _init_ctrls in range(12)]

class Devolucion(wx.Dialog):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Dialog.__init__(self, id=wxID_DEVOLUCION, name='Devolucion',
              parent=prnt, pos=wx.Point(325, 127), size=wx.Size(1022, 428),
              style=wx.DEFAULT_DIALOG_STYLE, title='Devolucion de Mercaderia')
        self.SetClientSize(wx.Size(1014, 401))

        self.staticText1 = wx.StaticText(id=wxID_DEVOLUCIONSTATICTEXT1,
              label='P.T.C.', name='staticText1', parent=self, pos=wx.Point(120,
              352), size=wx.Size(31, 13), style=0)

        self.comboBox1 = wx.ComboBox(choices=[], id=wxID_DEVOLUCIONCOMBOBOX1,
              name='comboBox1', parent=self, pos=wx.Point(8, 368),
              size=wx.Size(112, 21), style=0, value='')
        self.comboBox1.SetLabel('')

        self.textCtrl1 = wx.TextCtrl(id=wxID_DEVOLUCIONTEXTCTRL1,
              name='textCtrl1', parent=self, pos=wx.Point(120, 368),
              size=wx.Size(80, 21), style=0, value='')
        self.textCtrl1.Bind(wx.EVT_KILL_FOCUS, self.OnKillPTC)

        self.button3 = wx.Button(id=wxID_DEVOLUCIONBUTTON3, label='Limpiar',
              name='button3', parent=self, pos=wx.Point(328, 368),
              size=wx.Size(64, 23), style=0)
        self.button3.Bind(wx.EVT_BUTTON, self.OnLimpiar,
              id=wxID_DEVOLUCIONBUTTON3)

        self.checkBox1 = wx.CheckBox(id=wxID_DEVOLUCIONCHECKBOX1,
              label='Documento Interno', name='checkBox1', parent=self,
              pos=wx.Point(208, 368), size=wx.Size(128, 13), style=0)
        self.checkBox1.SetValue(False)

        self.button5 = wx.Button(id=wxID_DEVOLUCIONBUTTON5, label='Procesar',
              name='button5', parent=self, pos=wx.Point(872, 368),
              size=wx.Size(64, 23), style=0)
        self.button5.Bind(wx.EVT_BUTTON, self.OnGuardar,
              id=wxID_DEVOLUCIONBUTTON5)

        self.button4 = wx.Button(id=wxID_DEVOLUCIONBUTTON4, label='Salir',
              name='button4', parent=self, pos=wx.Point(944, 368),
              size=wx.Size(64, 23), style=0)
        self.button4.Bind(wx.EVT_BUTTON, self.OnSalir,
              id=wxID_DEVOLUCIONBUTTON4)

        self.grid1 = wx.grid.Grid(id=wxID_DEVOLUCIONGRID1, name='grid1',
              parent=self, pos=wx.Point(-32, 16), size=wx.Size(1040, 328),
              style=0)
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_LEFT_DCLICK,
              self.OnDobleClickIzquierdo)
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_RIGHT_DCLICK,
              self.OnDobleClickDerecho)

        self.staticText3 = wx.StaticText(id=wxID_DEVOLUCIONSTATICTEXT3,
              label='Temporada', name='staticText3', parent=self,
              pos=wx.Point(8, 352), size=wx.Size(54, 13), style=0)

        self.staticText2 = wx.StaticText(id=wxID_DEVOLUCIONSTATICTEXT2,
              label='DOBLE CLICK IZQUIERDA - aumenta en 1 (una) unidad',
              name='staticText2', parent=self, pos=wx.Point(408, 360),
              size=wx.Size(300, 13), style=0)
        self.staticText2.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))

        self.staticText4 = wx.StaticText(id=wxID_DEVOLUCIONSTATICTEXT4,
              label='DOBLE CLICK DERECHA  - resta en 1 (una) unidad (si queda en 0, borra renglon)',
              name='staticText4', parent=self, pos=wx.Point(408, 376),
              size=wx.Size(440, 13), style=0)
        self.staticText4.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))

    def __init__(self, parent):
        self._init_ctrls(parent)
        self.crearGrilla()
        self.textCtrl1.SetFocus()
        self.fil = 0
        self.llenarCombo()
        self.verificarInterrupcion()
        self.comboBox1.SetFocus()

    def llenarCombo(self):
        anio = int(utiles.obtenerFecha("Y-m-d")[:4])
        mes = int(utiles.obtenerFecha("Y-m-d")[5:7])
        dia = int(utiles.obtenerFecha("Y-m-d")[-2:])
        anioanterior = anio -1
        anioactual = anio
        aniosiguiente = anio + 1
        #self.comboBox1.Append("INVIERNO"+str(anioanterior))
        self.comboBox1.Append("VERANO"+str(anioanterior))
        self.comboBox1.Append("INVIERNO"+str(anioactual))
        self.comboBox1.Append("VERANO"+str(anioactual))
        self.comboBox1.Append("INVIERNO"+str(aniosiguiente))
        self.comboBox1.Append("VERANO"+str(aniosiguiente))
        self.comboBox1.SetEditable(False)

    def verificarInterrupcion(self):
        import os
        if not os.path.isfile("ComprasDevolucion2.txt"):
            f=open("ComprasDevolucion2.txt","w")
            f.close()
            print "Almacenamiento de Devolucion iniciado"
            return
        #existe archivo, por lo tanto un corte interrumpio la carga y se debe recuperar la informacion
        f=open("ComprasDevolucion2.txt","r")
        lista = f.readlines()
        f.close()
        if len(lista)==0:
            f=open("ComprasDevolucion2.txt","w")
            f.close()
            print "Almacenamiento de Devolucion iniciado"
            return
        print "Restaurando ultima Devolucion"
        for item in lista:
            cadena = item.split("[;]")
            try:
                fil = int(cadena[0])
            except:
                continue
            if fil<0: #se borra la linea
                try:
                    fil = int(cadena[1])
                except:
                    continue
                self.grid1.DeleteRows(fil)
                continue
                
            #PTC,CodSussan,Cant,Descripcion,Costo,Estacion,Grupo,NroProv,Proveedor
            #0   1         2    3           4     5        6     7       8
            #CodArtProveedor,NroFactura,Fecha,id,tipo,iva,temporada
            #9               10         11    12 13   14  15
            self.grid1.SetCellValue(fil,0, cadena[1])
            self.grid1.SetCellValue(fil,1, cadena[2])
            self.grid1.SetCellValue(fil,2, cadena[3])
            self.grid1.SetCellValue(fil,3, cadena[4])
            self.grid1.SetCellValue(fil,4, cadena[5])
            self.grid1.SetCellValue(fil,5, cadena[6])
            self.grid1.SetCellValue(fil,6, cadena[7])
            self.grid1.SetCellValue(fil,7, cadena[8])
            self.grid1.SetCellValue(fil,8, cadena[9])
            self.grid1.SetCellValue(fil,9, cadena[10])
            self.grid1.SetCellValue(fil,10,cadena[11])
            self.grid1.SetCellValue(fil,11,cadena[12])
            self.grid1.SetCellValue(fil,12,cadena[13])
            self.grid1.SetCellValue(fil,13,cadena[14])
            self.grid1.SetCellValue(fil,14,cadena[15])
            self.grid1.SetCellValue(fil,15,cadena[16])
            self.grid1.SetCellBackgroundColour(fil,2,GRIS)
            self.grid1.SetCellBackgroundColour(fil,4,GRIS)
            self.grid1.SetCellBackgroundColour(fil,7,GRIS)
            self.grid1.SetCellAlignment(fil, 0, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 1, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 2, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 4, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 7, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 9, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 10, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 11, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 12, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 13, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 14, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)

            self.soloLectura(fil)
            if (self.grid1.GetNumberRows()-1)==fil:
                self.grid1.AppendRows()
            self.soloLectura(fil+1)

        self.ajustarAnchoColumnas()

    def almacenamientoTemporal(self,fil,borrar=False):
        f=open("ComprasDevolucion2.txt","a")
        #PTC,CodSussan,Cant,Descripcion,Costo,Estacion,Grupo,NroProv,Proveedor
        #0   1         2    3           4     5        6     7       8
        #CodArtProveedor,NroFactura,Fecha,id,tipo,iva,temporada
        #9               10         11    12 13   14  15
        ptc = self.grid1.GetCellValue(fil,0)
        codsussan = self.grid1.GetCellValue(fil,1)
        cant = self.grid1.GetCellValue(fil,2)
        descripcion = self.grid1.GetCellValue(fil,3)
        costo = self.grid1.GetCellValue(fil,4)
        estacion = self.grid1.GetCellValue(fil,5)
        grupo = self.grid1.GetCellValue(fil,6)
        nroprov = self.grid1.GetCellValue(fil,7)
        proveedor = self.grid1.GetCellValue(fil,8)
        codartprov = self.grid1.GetCellValue(fil,9)
        nrofactura = self.grid1.GetCellValue(fil,10)
        fecha = self.grid1.GetCellValue(fil,11)
        id = self.grid1.GetCellValue(fil,12)
        tipo = self.grid1.GetCellValue(fil,13)
        iva = self.grid1.GetCellValue(fil,14)
        temporada = self.grid1.GetCellValue(fil,15)
        cadena = str(fil)+"[;]"
        cadena+= ptc+"[;]"+codsussan+"[;]"+cant+"[;]"+descripcion+"[;]"
        cadena+= costo+"[;]"+estacion+"[;]"+grupo+"[;]"+nroprov+"[;]"
        cadena+= proveedor+"[;]"+codartprov+"[;]"+nrofactura+"[;]"+fecha+"[;]"
        cadena+= id+"[;]"+tipo+"[;]"+iva+"[;]"+temporada+"[;]"
        if borrar:
            cadena = "-1[;]"+str(fil)+"[;]   "
        else:
            cadena = cadena[:-3]+"\n"
        f.write(cadena)
        f.close()

    def ajustarAnchoColumnas(self):
        for y in xrange(self.grid1.GetNumberCols()):
            self.grid1.AutoSizeColumn(y,True)
        
    def crearGrilla(self):
        #PTC,CodSussan,Cant,Descripcion,Costo,Estacion,Grupo,NroProv,Proveedor
        #0   1         2    3           4     5        6     7       8
        #CodArtProveedor,NroFactura,Fecha,id,tipo,iva,temporada
        #9               10         11    12 13   14  15
        columnas = ['PTC','Cod.\nSussan','Cant','Descripcion','Costo','Estacion',\
                    'Grupo','Nro\nProv.','Proveedor','Cod. Art\nProv.',\
                    'Documento','Fecha','id','tipo','iva','temporada']
        self.grid1.CreateGrid(1,len(columnas))
        for i, col in enumerate(columnas):
            self.grid1.SetColLabelValue(i, col)
        #self.grid1.EnableEditing(False)
        self.ajustarAnchoColumnas()
        self.grid1.SetSelectionMode(wx.grid.Grid.wxGridSelectRows)
        #self.grid1.EnableEditing(False)
        self.grid1.Refresh()

    def soloLectura(self,fila):
        #PTC,CodSussan,Cant,Descripcion,Costo,Estacion,Grupo,NroProv,Proveedor
        #0   1         2    3           4     5        6     7       8
        #CodArtProveedor,NroFactura,Fecha,id,tipo,iva,temporada
        #9               10         11    12 13   14  15
        for col in xrange(self.grid1.GetNumberCols()):
            if col==14:
                continue
            self.grid1.SetReadOnly(fila,col)

    def OnSalir(self, event):
        self.Close()

    def buscarPTCenGrilla(self,ptc):
        for x in xrange(self.grid1.GetNumberRows()):
            if self.grid1.GetCellValue(x,0)==ptc:return x
        return -1

    def buscarCodSussan(self,ptc):
        sql = "SELECT codsussan FROM producto_talle_color WHERE id='"+ptc+"' "
        resultado = consultasBD.ordenCruda(sql)
        if resultado==() or resultado==None or len(resultado)!=1:
            return ""
        return resultado[0][0]

    def buscarDatosProveedor(self,codsussan):
        r1 = "SELECT p1.idproveedor,p1.nombre,p3.codartprov,p2.descri "
        r2 = "FROM proveedor p1, "
        r3 = "     productos p2, "
        r4 = "     producto_codartprov p3 "
        r5 = "WHERE p2.proveedor=p1.idproveedor "
        r6 = "      AND p2.codsussan='"+codsussan+"' "
        r7 = "      AND p2.codsussan=p3.codsussan "
        sql = r1+r2+r3+r4+r5+r6+r7
        resultado = consultasBD.ordenCruda(sql)
        if resultado==() or resultado==None or len(resultado)!=1:
            return "","","",""
        return resultado[0][0],resultado[0][1],resultado[0][2],resultado[0][3]

    def buscarProducto(self,ptc="",codsussan=""):
        if ptc=="" and codsussan=="":
            return ()
        if ptc!="":
            condicion = "WHERE p2.id='"+ptc+"' \n"
        elif codsussan!="":
            condicion = "WHERE p1.codsussan='"+codsussan+"' \n"
        else:
            return ()
        r01 = "SELECT p3.idproveedor, p3.nombre, p1.codsussan, p2.id as ptc, \n"
        r02 = "       p1.descri, p1.estacion, p1.anio, p1.grupo, \n"
        r03 = "       p1.preciolt1 as pventa, p4.nombregrupo, p5.codartprov \n"
        r04 = "FROM productos p1, \n"
        r05 = "     producto_talle_color p2, \n"
        r06 = "     proveedor p3, \n"
        r07 = "     grupos p4, \n"
        r08 = "     producto_codartprov p5 \n"
        r09 = condicion
        r10 = "      AND p1.codsussan=p2.codsussan \n"
        r11 = "      AND p1.proveedor=p3.idproveedor \n"
        r12 = "      AND p1.grupo=p4.idgrupo \n"
        r13 = "      AND p5.codsussan=p1.codsussan \n"
        sql = r01+r02+r03+r04+r05+r06+r07+r08+r09+r10+r11+r12+r13

        resultado = consultasBD.ordenCrudaDict(sql)
        if resultado==() or resultado==None or len(resultado)!=1:
            return ()
        return resultado[0]

    def buscarStock(self,ptc="",codsussan=""):
        sucursal = str(utiles.getSucursalActiva())
        if ptc != "":
            r1 = "SELECT s.stock FROM stock s "
            r2 = "WHERE s.ptc='"+ptc+"' "
            r3 = "      AND s.sucursal='"+sucursal+"' "
            sql = r1+r2+r3
        elif codsussan != "":
            r1 = "SELECT s.stock FROM stock s, producto_talle_color p "
            r2 = "WHERE p.codsussan='"+codsussan+"' "
            r3 = "      AND p.id=s.ptc "
            r4 = "      AND s.sucursal='"+sucursal+"' "
            sql = r1+r2+r3+r4
        else:
            return 0
        resultado = consultasBD.ordenCruda(sql)
        if len(resultado)!=1:
            return 0
        return resultado[0][0]

    def OnDobleClickIzquierdo(self, event):
        #PTC,CodSussan,Cant,Descripcion,Costo,Estacion,Grupo,NroProv,Proveedor
        #0   1         2    3           4     5        6     7       8
        #CodArtProveedor,NroFactura,Fecha,id,tipo,iva,temporada
        #9               10         11    12 13   14  15
        #suma cantidad
        if self.grid1.GetGridCursorRow()==(self.grid1.GetNumberRows()-1):
            return
        fila = self.grid1.GetGridCursorRow()
        if self.grid1.GetCellValue(fila,0)=="":
            return

        cantidad = int(self.grid1.GetCellValue(fila,2))
        cantidad+= 1
        self.grid1.SetCellValue(fila,2,str(cantidad))
        self.almacenamientoTemporal(fila)

    def OnDobleClickDerecho(self, event):
        #PTC,CodSussan,Cant,Descripcion,Costo,Estacion,Grupo,NroProv,Proveedor
        #0   1         2    3           4     5        6     7       8
        #CodArtProveedor,NroFactura,Fecha,id,tipo,iva,temporada
        #9               10         11    12 13   14  15
        #resta cantidad
        if self.grid1.GetGridCursorRow()==(self.grid1.GetNumberRows()-1):
            return
        fila = self.grid1.GetGridCursorRow()
        if self.grid1.GetCellValue(fila,0)=="":
            return

        cantidad = int(self.grid1.GetCellValue(fila,2))
        cantidad-= 1
        self.grid1.SetCellValue(fila,2,str(cantidad))
        
        #borra renglon
        if cantidad<=0:
            self.almacenamientoTemporal(fila,True)
            self.grid1.DeleteRows(fila)
            return

        self.almacenamientoTemporal(fila)

    def OnKillPTC(self, event):
        #PTC,CodSussan,Cant,Descripcion,Costo,Estacion,Grupo,NroProv,Proveedor
        #0   1         2    3           4     5        6     7       8
        #CodArtProveedor,NroFactura,Fecha,id,tipo,iva,temporada
        #9               10         11    12 13   14  15
        #resta cantidad
        if self.textCtrl1.GetLabel()=="":
            return
        if self.comboBox1.GetSelection() < 0:
            utiles.mensaje(None,"Debe seleccionar temporada")
            self.comboBox1.SetFocus()
            return False
        nuevo = False
        ptc = self.textCtrl1.GetLabel()
        fila = self.buscarPTCenGrilla(ptc)
        if fila<0:
            fila = self.grid1.GetNumberRows()-1
            nuevo = True
        self.textCtrl1.SetLabel("")
        self.textCtrl1.SetFocus()
        codsussan = self.buscarCodSussan(ptc)
        seleccion = {"idfactura":"","costo":"","fechafactura":"",\
                     "nrofactura":"","en1oen2":"","porIVA":"","tipoDoc":""}
        if nuevo:
            r1 = "SELECT p1.nrofactura,p1.fechafactura, p1.idfactura,"
            r2 = "       p1.en1oen2,p2.costounidad, p1.porIVA, "
            r3 = "       p1.tipodoc as tipoDoc "
            r4 = "FROM compras p1, compras_items p2 "
            r5 = "WHERE p2.codsussan = '"+codsussan+"' "
            r6 = "      AND p2.idfactura = p1.idfactura "
            r7 = "GROUP BY p1.idfactura "
            r8 = "ORDER BY p2.costounidad DESC, p1.porIVA LIMIT 1 "
            sql = r1+r2+r3+r4+r5+r6+r7+r8
            resultado = consultasBD.ordenCrudaDict(sql)
            if len(resultado)!=1:
                utiles.mensaje(None,"Error: no identificado datos que seleccionar")
                return
            resultado = resultado[0]
            seleccion["fechafactura"] = resultado["fechafactura"]
            seleccion["nrofactura"] = resultado["nrofactura"]
            seleccion["idfactura"] = resultado["idfactura"]
            seleccion["en1oen2"] = resultado["en1oen2"]
            seleccion["costo"] = resultado["costounidad"]
            seleccion["porIVA"] = resultado["porIVA"]
            seleccion["tipoDoc"] = resultado["tipoDoc"]

        self.llenarMiGrilla(nuevo,fila,seleccion,ptc,codsussan)
            
    def llenarMiGrilla(self,nuevo,fila,seleccion,ptc,codsussan):
        fil = fila
        if nuevo: #producto nuevo, se agrega en la grilla
            producto = self.buscarProducto(ptc=ptc)
            if producto == ():
                utiles.mensaje(None,"Error: no encontrada informacion del producto")
                self.textCtrl1.SetFocus()
                return
            producto["stock"] = self.buscarStock(codsussan=codsussan)
            producto["fechafactura"] = seleccion["fechafactura"]
            producto["nrofactura"] = seleccion["nrofactura"]
            producto["idfactura"] = seleccion["idfactura"]
            producto["en1oen2"] = seleccion["en1oen2"]
            producto["costo"] = seleccion["costo"]
            producto["porIVA"] = seleccion["porIVA"]
            producto["tipoDoc"] = seleccion["tipoDoc"]
            cantidad = "1"

            #PTC,CodSussan,Cant,Descripcion,Costo,Estacion,Grupo,NroProv,Proveedor
            #0   1         2    3           4     5        6     7       8
            #CodArtProveedor,NroFactura,Fecha,id,tipo,iva,temporada
            #9               10         11    12 13   14  15
            self.grid1.SetCellValue(fil,0,str(producto["ptc"]))
            self.grid1.SetCellValue(fil,1,str(producto["codsussan"]))
            self.grid1.SetCellValue(fil,2,str(cantidad))
            self.grid1.SetCellValue(fil,3,str(producto["descri"]))
            self.grid1.SetCellValue(fil,4,str(producto["costo"]))
            self.grid1.SetCellValue(fil,5,str(producto["estacion"])+" / "+str(producto["anio"]))
            self.grid1.SetCellValue(fil,6,str(producto["nombregrupo"])+" / "+str(producto["grupo"]))
            self.grid1.SetCellValue(fil,7,str(producto["idproveedor"]))
            self.grid1.SetCellValue(fil,8,str(producto["nombre"]))
            self.grid1.SetCellValue(fil,9,str(producto["codartprov"]))
            self.grid1.SetCellValue(fil,10,str(producto["nrofactura"])+" / "+str(producto["tipoDoc"]))
            fecha = str(producto["fechafactura"])[:10]
            fecha = utiles.invertirFecha2(fecha)
            self.grid1.SetCellValue(fil,11,fecha)
            self.grid1.SetCellValue(fil,12,str(producto["idfactura"]))
            self.grid1.SetCellValue(fil,13,str(producto["en1oen2"]))
            self.grid1.SetCellValue(fil,14,str(producto["porIVA"]))
            self.grid1.SetCellValue(fil,15,self.comboBox1.GetLabel())

            self.grid1.SetCellBackgroundColour(fil,2,GRIS)
            self.grid1.SetCellBackgroundColour(fil,4,GRIS)
            self.grid1.SetCellBackgroundColour(fil,7,GRIS)
            self.grid1.SetCellAlignment(fil, 0, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 1, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 2, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 4, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 7, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 9, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 10, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 11, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 12, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 13, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 14, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)

            self.soloLectura(fil)
            self.grid1.AppendRows()

        else: #el producto no es nuevo y ya esta en la grilla
            #PTC,CodSussan,Cant,Descripcion,Costo,Estacion,Grupo,NroProv,Proveedor
            #0   1         2    3           4     5        6     7       8
            #CodArtProveedor,NroFactura,Fecha,id,tipo,iva,temporada
            #9               10         11    12 13   14  15
            try:
                cantidad = int(self.grid1.GetCellValue(fil,2))
            except:
                cantidad = 1
            cantidad+= 1
            self.grid1.SetCellValue(fil,2,str(cantidad))

        self.almacenamientoTemporal(fil)
        self.ajustarAnchoColumnas()
        self.textCtrl1.SetLabel("")
        self.textCtrl1.SetFocus()

    def OnLimpiar(self, event):
        self.grid1.ClearGrid()
        for i in xrange(self.grid1.GetNumberRows()):
            self.grid1.DeleteRows()
        self.grid1.AppendRows()
        self.soloLectura(0)
        self.textCtrl1.SetFocus()
        self.textCtrl1.SetLabel("")
        self.checkBox1.SetValue(False)
        f=open("ComprasDevolucion2.txt","w")
        f.close()

    def unicosProveedores(self):
        lista = []
        #PTC,CodSussan,Cant,Descripcion,Costo,Estacion,Grupo,NroProv,Proveedor
        #0   1         2    3           4     5        6     7       8
        #CodArtProveedor,NroFactura,Fecha,id,tipo,iva,temporada
        #9               10         11    12 13   14  15
        for fil in xrange(self.grid1.GetNumberRows()):
            if self.grid1.GetCellValue(fil,0)=="":
                continue
            idproveedor = self.grid1.GetCellValue(fil,7)
            iva = self.grid1.GetCellValue(fil,14)
            tipo = self.grid1.GetCellValue(fil,13)
            nrofactura = self.grid1.GetCellValue(fil,10)
            nombre = self.grid1.GetCellValue(fil,8)
            temporada = self.grid1.GetCellValue(fil,15)
            datos = (idproveedor,iva,tipo,nrofactura,nombre,temporada)
            if not datos in lista:
                lista.append(datos)
        return lista

    def cargarObservaciones(self):
        diccionario = {}
        lista = []
        import ComprasDevolucionObservaciones
        #PTC,CodSussan,Cant,Descripcion,Costo,Estacion,Grupo,NroProv,Proveedor
        #0   1         2    3           4     5        6     7       8
        #CodArtProveedor,NroFactura,Fecha,id,tipo,iva,temporada
        #9               10         11    12 13   14  15
        for fil in xrange(self.grid1.GetNumberRows()):
            if self.grid1.GetCellValue(fil,0)=="":
                continue
            idproveedor = self.grid1.GetCellValue(fil,7)
            iva = self.grid1.GetCellValue(fil,14)
            tipo = self.grid1.GetCellValue(fil,13)
            nrofactura = self.grid1.GetCellValue(fil,10)
            nombre = self.grid1.GetCellValue(fil,8)
            temporada = self.grid1.GetCellValue(fil,15)
            datos = (idproveedor,iva,tipo,nrofactura,nombre,temporada)
            if datos in lista: 
                continue
            lista.append(datos)
            proveedor = datos[4]+" / "+datos[0]
            observaciones = ComprasDevolucionObservaciones.Dialog1(None, proveedor, False)
            try:
                observaciones.ShowModal()
                obs = observaciones.getObservacion()
                diccionario[datos]=obs
            finally:
                observaciones.Destroy()
        return diccionario

    def actualizandoStock(self,sucursal):
        #PTC,CodSussan,Cant,Descripcion,Costo,Estacion,Grupo,NroProv,Proveedor
        #0   1         2    3           4     5        6     7       8
        #CodArtProveedor,NroFactura,Fecha,id,tipo,iva,temporada
        #9               10         11    12 13   14  15
        print "- actualizando stock"
        for fil in xrange(self.grid1.GetNumberRows()):
            if self.grid1.GetCellValue(fil,0)=="":
                continue
            ptc = self.grid1.GetCellValue(fil,0)
            stock = self.buscarStock(ptc=ptc)
            devol = int(self.grid1.GetCellValue(fil,2))
            nuevostock = stock-devol
            if nuevostock < 0:
                texto = "No hay stock suficiente en producto "+ptc+"\n"
                texto+= "Tome nota para verificarlo despues."
                utiles.mensaje(None,texto)
                #return False
            r1 = "UPDATE stock SET stock = '%s' " % (str(nuevostock))
            r2 = "WHERE ptc='%s' AND sucursal='%s' " % (ptc, sucursal)
            sql = r1+r2
            consultasBD.executaSinCommit(None, sql)
            sincronizar_tabla.addChange(sql=sql)
            print "  actualizando",ptc,self.grid1.GetCellValue(fil,3)
        return True

    def obtieneNumeroRegistro(self,idproveedor):
        try:
            #saca el nro de registro
            sql2 = "SELECT idregistro FROM proveedor WHERE idproveedor='%s'" % str(idproveedor)
            resultado = consultasBD.ordenCrudaResultDict(sql2)
            registro = int(resultado["idregistro"])+1
        except:
            registro = -1
        return registro

    def armaClave(self,fil):
        dato1 = self.grid1.GetCellValue(fil,7) #idproveedor
        dato2 = self.grid1.GetCellValue(fil,14) #iva
        dato3 = self.grid1.GetCellValue(fil,13) #tipo
        dato4 = self.grid1.GetCellValue(fil,10) #nrofactura
        dato5 = self.grid1.GetCellValue(fil,8) #nombre
        dato6 = self.grid1.GetCellValue(fil,15) #temporada
        return (dato1,dato2,dato3,dato4,dato5,dato6)

    def actualizandoArchivos(self,listaProveedores,listaObservaciones):
        print "- generando devoluciones en archivos"
        #PTC,CodSussan,Cant,Descripcion,Costo,Estacion,Grupo,NroProv,Proveedor
        #0   1         2    3           4     5        6     7       8
        #CodArtProveedor,NroFactura,Fecha,id,tipo,iva,temporada
        #9               10         11    12 13   14  15
        devolucion = {}
        listaIdDevolucion = []
        for item in listaProveedores:

            registro = self.obtieneNumeroRegistro(item[0])
            sucursal = str(utiles.getSucursalActiva())
            idDevolucion =  str(utiles.secuencia("compras_devolucion", sucursal))
            listaIdDevolucion.append(idDevolucion)
            fecha = utiles.obtenerFecha("Y-m-d h:m:s")
            auditoria = fecha
            idProveedor = item[0]

            dato1 = item[0] #idproveedor
            dato2 = item[1] #iva
            dato3 = item[2] #tipo
            dato4 = item[3] #nrofactura
            dato5 = item[4] #nombre
            dato6 = item[5] #temporada
            clave = (dato1,dato2,dato3,dato4,dato5,dato6)

            totalProvSinIVA = Decimal("0.00")
            totalProvIVA = Decimal("0.00")
            totalProveedor = Decimal("0.00")
            cantidadPrendas = 0
            temporada = ""

            for fil in xrange(self.grid1.GetNumberRows()):
                if self.grid1.GetCellValue(fil,0)=="":
                    continue
                clave1 = self.armaClave(fil)
                if clave == clave1:
                    temporada = self.comboBox1.GetLabel()
                    costo = Decimal(self.grid1.GetCellValue(fil,4))
                    cantidad = int(self.grid1.GetCellValue(fil,2))
                    cantidadPrendas+= cantidad
                    subtotal = costo*cantidad
                    totalProvSinIVA+= subtotal
                    iva = Decimal("0.00")
                    if self.grid1.GetCellValue(fil,13)=="1":
                        try:
                            porcentaje = Decimal(self.grid1.GetCellValue(fil,14))
                        except:
                            porcentaje = Decimal("0.00")
                        iva = subtotal*porcentaje/Decimal("100.00")
                    totalProvIVA+= iva
                    subtotal = subtotal+iva
                    totalProveedor+= subtotal

                    #PTC,CodSussan,Cant,Descripcion,Costo,Estacion,Grupo,NroProv,Proveedor
                    #0   1         2    3           4     5        6     7       8
                    #CodArtProveedor,NroFactura,Fecha,id,tipo,iva,temporada
                    #9               10         11    12 13   14  15
                    ptc = self.grid1.GetCellValue(fil,0)
                    codsussan = self.grid1.GetCellValue(fil,1)
                    talle = ""
                    color = ""
                    monto = self.grid1.GetCellValue(fil,4)
                    otro = ""
                    
                    print "  procesando",idProveedor,ptc
                    r1 = "INSERT INTO comprasdevoluciones_items(idDevolucion, "
                    r2 = "            idProveedor,fecha,ptc,codsussan, "
                    r3 = "            talle,color,cantidad,monto,otro) "
                    r4 = "VALUES ('%s','%s','%s','%s'," % (idDevolucion,idProveedor,fecha,ptc)
                    r5 = "'%s','%s','%s','%s'," % (codsussan,talle,color,cantidad)
                    r6 = "'%s','%s')" % (monto,otro)
                    sql = r1+r2+r3+r4+r5+r6
                    consultasBD.executaSinCommit(None, sql)

            fecha = utiles.obtenerFecha("Y-m-d h:m:s")
            idproveedor = item[0]
            # FactA  0 - FactC  1 - Rto1  2 - Rto2  3 - NtaCredito  4 - NtaDebito 5 
            # Otros2 6 - Otros1 7 - Pag1  8 - Pag2  9 - Credito2    10
            if item[2]=='1':
                total1 = str(totalProveedor)
                total2 = "0.00"
            else:
                total1 = "0.00"
                total2 = str(totalProveedor)
            nrofactura,tipoDoc = (item[3]).split(" / ")
            cantprendas = str(cantidadPrendas)
            en1oen2 = item[2]
            observaciones = listaObservaciones[clave]

            devolucion[idproveedor]=(cantidadPrendas,observaciones,totalProveedor)
            
            if self.checkBox1.GetValue():
                interno = "1"
            else:
                interno = "0"

            r1 = "INSERT INTO comprasaldos ("
            r2 = "idoperacion,fecha,idproveedor,"
            r3 = "monto1,monto2,tipodoc,nrofactura, "
            r4 = "cantproductos,idforma1o2,observaciones,"
            r5 = "operador,temporada,idregistro,interno) "
            r6 = "VALUES ("
            r7 = "'%s', '%s', '%s'," % ("DEVOLUCION",fecha,idproveedor)
            r8 = "'%s', '%s', '%s', '%s'," % (total1,total2,tipoDoc,nrofactura)
            r9 = "'%s', '%s', '%s'," % (cantprendas,en1oen2,observaciones)
            r0 = "'%s', '%s', '%s'," % ("",temporada,registro)
            rA = "'%s')" % (interno)
            sql = r1+r2+r3+r4+r5+r6+r7+r8+r9+r0+rA
            consultasBD.executaSinCommit(None, sql)

            r1 = "INSERT INTO comprasdevoluciones(idDevolucion,idProveedor, \n"
            r2 = "            fecha,cantProductos,montoDevolucion, \n"
            r3 = "            causaDevolucion,auditoria) "
            r4 = "VALUES ('%s','%s'," % (idDevolucion,idproveedor)
            r5 = "'%s','%s','%s'," % (fecha,cantprendas,str(totalProveedor))
            r6 = "'%s','%s')" % (observaciones,auditoria)
            sql = r1+r2+r3+r4+r5+r6
            consultasBD.executaSinCommit(None, sql)

        return True,devolucion,listaIdDevolucion

    def buscarCodArtProveedor(self,codsussan):
        sql = "SELECT codartprov FROM producto_codartprov WHERE codsussan='"+codsussan+"' "
        resultado = consultasBD.ordenCruda(sql)
        if resultado == None or resultado == () or len(resultado)==0:
            return ""
        return str(resultado[0][0])

    def imprimirDevoluciones(self,items,f,listaIdDevoluciones,nrodevolucion="DEVOLUCION"):
        print "  imprimir Devoluciones para",items[4]
        #PTC,CodSussan,Cant,Descripcion,Costo,Estacion,Grupo,NroProv,Proveedor
        #0   1         2    3           4     5        6     7       8
        #CodArtProveedor,NroFactura,Fecha,id,tipo,iva,temporada
        #9               10         11    12 13   14  15

        numeroPagina = 1
        nrosuc,nombresuc = utiles.datosSucursal()
        
        totalItemPorPagina = 50-6 #resto 6 estimando renglones de encabezado
        totalPaginas = len(items) / totalItemPorPagina 
        totalPaginas+= 1

        nombre = items[4]
        idproveedor = items[0]
        en1oen2 = 0
        marcaIVA = ""
        
        def encabezadoPagina(texto):
            fecha = utiles.obtenerFecha("d-m-Y")

            a = '<table width="100%" cellspacing="0" border="1"> \n'
            a+= '<tr><td> \n'
            a+= '<table width="100%" cellspacing="0" border="0"> \n'
            a+= '<tr> \n'
            a+= '<td valign="top" align="left" width="33%"> \n'
            a+= '<strong>SUSSAN S.R.L.<br> \n'
            a+= '<font size="1">General L&oacute;pez 3110 esq. Urquiza<br> \n'
            a+= 'SANTA FE - cp: S3000DCR<br> \n'
            a+= 'cuit: 30-71105924-1 web: http://www.sussanboutique.com.ar e-mail: sussanboutique@gmail.com</font></strong> \n'
            a+= '</td> \n'
            a+= '<td valign="top" align="right" width="33%">'+fecha+' \n'
            a+= '<br>P&aacute;gina '+str(numeroPagina)+' / '+str(totalPaginas)+'</td> \n'
            a+= '</tr> \n'
            a+= '</table> \n'
            a+= '</td></tr> \n'
            a+= '</table><br><div align="right"> \n'
            a+= '<strong>'+nrodevolucion+'</strong></div><div align="left"> \n'
            a+= 'Proveedor: <strong>'+nombre+"</strong> / "+idproveedor+'<br> \n'
            if self.observaciones!="":
                a+= '<br>Motivo de la devoluci&oacute;n: '+self.observaciones
            a+= '</div><br> \n'
            texto+= a
            return texto
        
        def encabezadoTabla(texto):
            #PTC,CodSussan,Cant,Descripcion,Costo,Estacion,Grupo,NroProv,Proveedor
            #0   1         2    3           4     5        6     7       8
            #CodArtProveedor,NroFactura,Fecha,id,tipo,iva,temporada
            #9               10         11    12 13   14  15
            #a = '<hr>'
            a = ''

            a+= '<table width="100%" cellspacing="0" border="1"> \n'
            a+= '<tr> \n'
            a+= '<td valign="top" align="right"></td> \n'
            a+= '<td valign="top" align="right">C&oacute;digo<br>Proveedor</td> \n'
            a+= '<td valign="top" align="right">Nro.Factura</td> \n'
            a+= '<td valign="top" align="center">P.T.C.</td> \n'
            a+= '<td valign="top" align="center">C&oacute;d.<br>Sussan</td> \n'
            a+= '<td valign="top" align="left">Descripci&oacute;n</td> \n'
            a+= '<td valign="top" align="right">Cant</td> \n'
            a+= '<td valign="top" align="right">Costo<br>Unidad</td> \n'
            a+= '<td valign="top" align="right">Subtotal</td> \n'
            a+= '</tr> \n'
            a+= '<tr> \n'
            a+= '<td colspan="8"></td> \n'
            a+= '</tr> \n'
            texto+= a
            return texto

        def piePagina(totalProductos,totalSubtotal,totalIVA,totalTotal):
            a = '<table width="100%" cellspacing="0" border="1"> \n'
            a+= '<tr><td> \n'
            a+= '<table width="100%" cellspacing="0" border="0"> \n'
            a+= '<tr> \n'
            a+= '<td valign="top" align="left" width="33%"> \n'
            a = '<tr> \n'
            a+= '<td valign="top" align="right" colspan="6">TOTALES</td> \n' #orden
            a+= '<td valign="top" align="right">'+str(totalProductos)+'</td> \n'
            a+= '<td valign="top" align="right"></td> \n'
            a+= '<td valign="top" align="right">'+str(totalSubtotal)+'</td> \n'
            a+= '</tr> \n'
            if marcaIVA=="*":
                a+= '<tr> \n'
                a+= '<td valign="top" align="right" colspan="8">IVA*</td> \n'
                a+= '<td valign="top" align="right">'+str(totalIVA)+'</td>'
                a+= '</tr>'
                a+= '<tr> \n'
                a+= '<td valign="top" align="right" colspan="8">TOTAL CON IVA</td> \n'
                a+= '<td valign="top" align="right">'+str(totalTotal)+'</td>'
                a+= '</tr>'
            a+= '</table> \n'
            a+= '</td></tr> \n'
            a+= '</table><br> \n'
            texto = a
            return texto
        
        cadena = '<?xml version="1.0" encoding="utf-8" ?> \n'
        cadena+= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> \n'
        cadena+= '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> \n'
        cadena+= '<head> \n'
        cadena+= '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> \n'
        cadena+= '<meta name="generator" content="Docutils 0.4.1: http://docutils.sourceforge.net/" /> \n'
        cadena+= '<title>Sussan Boutique</title> \n'
        cadena+= '</head> \n'
        cadena+= '<body> \n'

        cadena = encabezadoPagina(cadena)
        cadena = encabezadoTabla(cadena)
        f.write(cadena)

        renglon = 0

        totalProductos = 0
        totalSubtotal = Decimal("0.00")
        totalIVA = Decimal("0.00")
        totalTotal = Decimal("0.00")
        orden = 0
        
        for fil in xrange(self.grid1.GetNumberRows()):
            aux1 = self.grid1.GetCellValue(fil,7)
            aux2 = self.grid1.GetCellValue(fil,14)
            aux3 = self.grid1.GetCellValue(fil,13)
            aux4 = self.grid1.GetCellValue(fil,10)
            aux5 = self.grid1.GetCellValue(fil,8)
            aux6 = self.grid1.GetCellValue(fil,15)
            clave = (aux1,aux2,aux3,aux4,aux5,aux6)
            if clave!=items or self.grid1.GetCellValue(fil,0)=="":
                continue
            orden+= 1
            #PTC,CodSussan,Cant,Descripcion,Costo,Estacion,Grupo,NroProv,Proveedor
            #0   1         2    3           4     5        6     7       8
            #CodArtProveedor,NroFactura,Fecha,id,tipo,iva,temporada
            #9               10         11    12 13   14  15
            codsussan = self.grid1.GetCellValue(fil,1)
            try:
                codartproveedor = self.buscarCodArtProveedor(codsussan)
            except:
                codartproveedor = ""
            descripcion = self.grid1.GetCellValue(fil,3)
            cantidad = int(self.grid1.GetCellValue(fil,2))
            nrofactura,tipodoc = (self.grid1.GetCellValue(fil,10)).split(" / ")
            costo = self.grid1.GetCellValue(fil,4)
            totalProductos+= cantidad
            ptc = self.grid1.GetCellValue(fil,0)

            cantidad = Decimal(str(cantidad))
            costounitario = Decimal(costo)
            subtotal = Decimal(str(cantidad*costounitario)).quantize(Decimal("0.10"))
            en1oen2 = int(self.grid1.GetCellValue(fil,13))
            iva = Decimal("0.00").quantize(Decimal("0.10"))
            marca = ""
            if en1oen2==1:
                try:
                    porcentaje = Decimal(self.grid1.GetCellValue(fil,14)).quantize(Decimal("0.10"))
                except:
                    porcentaje = Decimal("0.00")
                iva = (Decimal(str(subtotal*porcentaje/Decimal("100.00")))).quantize(Decimal("0.10"))
                marcaIVA = "*"
                marca = marcaIVA
            else:
                marca = ""
            total = (subtotal+iva).quantize(Decimal("0.10"))
            
            totalSubtotal+= subtotal
            totalIVA+= iva
            totalTotal+= total
        
            cadena = '<tr> \n'
            cadena+= '<td valign="top" align="right">'+str(orden)+'</td> \n'
            cadena+= '<td valign="top" align="right">'+codartproveedor+'</td> \n'
            cadena+= '<td valign="top" align="right">'+nrofactura+'</td> \n'
            cadena+= '<td valign="top" align="center">'+ptc+'</td> \n'
            cadena+= '<td valign="top" align="center">'+codsussan+'</td> \n'
            cadena+= '<td valign="center" align="left"><font size="2.5">'+descripcion+'</font></td> \n'
            cadena+= '<td valign="top" align="right">'+str(cantidad)+'</td> \n'
            cadena+= '<td valign="top" align="right">'+str(costounitario)+'</td> \n'
            cadena+= '<td valign="top" align="right">'+marca+' '+str(subtotal)+'</td> \n'
            cadena+= '</tr>\n'
            f.write(cadena)
            
            renglon+= 1
            
            if renglon == totalItemPorPagina :
                cadena = '</table> \n'
                cadena = piePagina(totalProductos,totalSubtotal,totalIVA,totalTotal)
                f.write(cadena)
                f.write("</table><!-- salto de pagina -->\n")
                f.write("<p STYLE='page-break-after: always;'></p>\n")
                renglon = 0
                numeroPagina+= 1
                cadena = encabezadoPagina("")
                cadena = encabezadoTabla(cadena)
                f.write(cadena)

        cadena = '</table> \n'
        cadena = piePagina(totalProductos,totalSubtotal,totalIVA,totalTotal)
        f.write(cadena)
        f.write("</table><!-- salto de pagina -->\n")
        f.write("<p STYLE='page-break-after: always;'></p>\n")

    def OnGuardar(self, event):
        print "Procesando Devoluciones"
        if self.comboBox1.GetSelection()<0:
            utiles.mensaje(None,"Debe introducir una temporada")
            self.comboBox1.SetFocus()
            return
        sucursal = utiles.getSucursalActiva()
        listaProveedores = self.unicosProveedores()
        listaObservaciones = self.cargarObservaciones()
        
        if listaProveedores==[]:
            utiles.mensaje(None,"No hay datos que procesar")
            return False

        try:
            consultasBD.begin()

            if not self.actualizandoStock(sucursal):
                self.Close()
                return
            ok,devolucion,listaIdDevolucion = self.actualizandoArchivos(listaProveedores,listaObservaciones)
            if not ok: return
            f=open("c:\\erpsussan.doc\\reporte-devoluciones.html","w")
            print "- generando reporte impreso"
            idDevolucion = 0
            for item in listaProveedores:
                self.observaciones = listaObservaciones[item]
                nrodevolucion = str(listaIdDevolucion[idDevolucion])
                nrodevolucion = "DEVOLUCION "+nrodevolucion
                idDevolucion+= 1
                self.imprimirDevoluciones(item,f,listaIdDevolucion,nrodevolucion)
            f.close()

            print "- finalizando procesamiento"
            print
            consultasBD.commit()

            import os
            os.system("taskkill /IM firefox.exe /F")
            os.system("c:\\explorer.lnk c:\\erpsussan.doc\\reporte-devoluciones.html")

            #sincronizar_tabla.syncServerTables(self, ["stock"])
            self.OnLimpiar(None)

        except:
            utiles.mensaje(None,"No pudo procesarse la devolucion")
            consultasBD.rollback()
